<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>04_原型链_属性问题</title>
</head>
<body>
<!--
1. 读取对象的属性值时: 会自动到原型链中查找
2. 设置对象的属性值时: 不会查找原型链, 如果当前对象中没有此属性, 直接添加此属性并设置其值
3. 方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上
-->
<script type="text/javascript">

  // 给原型对象添加属性(一般都是方法)
  // 构造函数
  function students() {}
  // 可以使用students.prototype 直接访问到原型对象
  students.prototype.name='殇不患';
  students.prototype.age=40;
  console.log(students.prototype);//{name: "殇不患", age: 40, constructor: ƒ}

  //实例对象
  var stu=new students();
  console.log(stu.__proto__);//{name: "殇不患", age: 40, constructor: ƒ}
  console.log(students.prototype===stu.__proto__);//true
  // 由于不能修改原型中的值，则这种方法就直接在stu中添加了一个新的属性name
  stu.name='独孤求败';
  console.log(stu.name);//独孤求败

  //实例对象
  var stu1=new students();
  // 由于stu1中没有name属性，则对stu1来说仍然是访问的原型中的属性。
  console.log(stu1.name);//殇不患



  function Person(name, age) {
    this.name = name;
    this.age = age;
  }
  Person.prototype.setName = function (name) {
    this.name = name;
  }
  Person.prototype.sex = '男';

  var p1 = new Person('Tom', 12)
  p1.setName('Jack')
  console.log(p1.name, p1.age, p1.sex)//Jack 12 男
  p1.sex = '女'
  console.log(p1.name, p1.age, p1.sex)//Jack 12 女

  var p2 = new Person('Bob', 23)
  console.log(p2.name, p2.age, p2.sex)//Tom 23 男
  
</script>
</body>
</html>